package com.dsk.connector.commons.conf;

import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Data
public class TableMapping {
    /**
     * 源表
     * 表名带有数据库前缀，比如 db1.table1
     */
    private String sourceTable;
    /**
     * 目标表
     * 表名带有数据库前缀，比如 db1.table1
     */
    private String targetTable;
    /**
     * 需要同步DDL的操作
     * alter,create,drop,truncate,rename
     */
    private String ddl;
    /**
     * 需要同步的dml操作，
     * 可选值： insert,update,delete
     */
    private String dml;
    /**
     * 是否拆分目标表
     * 拆表目标表时，可以根据某个字段进行拆分，比如根据日期拆分
     * 根据日期拆分时，可以指定取出的字段长度，比如 8 表示取日期的年月日，10 表示取日期的年月日时分秒
     * 比如：2021-01-01 12:00:00，取出的字段长度为 8 时，拆分后的表名为 db1.table1_20210101
     * 截取长度时，先将字段转为字符串，再截取指定长度
     * 日期类型转换时，采用不带分隔符的格式，比如：2021-01-01 12:00:00转为 20210101120000
     *
     */
    private boolean splitTable;
    /**
     * 拆分表的指定字段
     * 多个字段使用分号分隔
     * 取第一个不为空的值做为分隔数
     */
    private String splitField;
    /**
     * 截取长度
     * 如果不指定或者小于等于0，则以整个数值长度为准
     */
    private Integer splitFieldLength;

    public Set<String> getDMLs(){
        Set<String> ops = new HashSet<>();
        if(dml != null){
            String[] dmlArray=dml.split(";");
            for(String op:dmlArray){
                if(StringUtils.isNotBlank(op)){
                    ops.add(op.trim().toLowerCase());
                }
            }
        }
        return ops;
    }

    public Set<String> getDDLs(){
        Set<String> ops = new HashSet<>();
        if(ddl != null){
            String[] dmlArray=ddl.split(";");
            for(String op:dmlArray){
                if(StringUtils.isNotBlank(op)){
                    ops.add(op.trim().toLowerCase());
                }
            }
        }
        return ops;
    }

    public List<String> getSplitFields(){
        List<String> fields = new ArrayList<>();
        if(splitField != null){
            String[] dmlArray=splitField.split(";");
            for(String op:dmlArray){
                if(StringUtils.isNotBlank(op)){
                    fields.add(op.trim().toLowerCase());
                }
            }
        }
        return fields;
    }
}
